<!--
 * @Author: weidewei
 * @Date: 2025-10-28 09:44:23
 * @LastEditors: weidewei
 * @LastEditTime: 2025-10-28 14:51:05
 * @Description: 
 * @FilePath: \2025-front-face\js\原型链练习.html
-->
<script>
  // 1. 构造函数 → 原型对象
  Constructor.prototype === instance.__proto__;
  // 2. 原型对象 → 构造函数
  Constructor.prototype.constructor === Constructor;
  // 3. 实例 → 原型对象
  Object.getPrototypeOf(instance) === Constructor.prototype;
  // function A() {
        
  // }
  // const a = new A();
  // console.log(a.__proto__ === A.prototype); // new出来的实例的隐式原型指向构造函数的显式原型
  // console.log(A.prototype.constructor === A); // 原型对象通过constructor属性指回构造函数

  function Animal(name) {
    this.name = name;
  }

  Animal.prototype.eat = function () {
    console.log(`${this.name} is eating`);
  };

  function Dog(name, breed) {
    Animal.call(this, name); // 改变了Animald的this指向,将Animal构造函数的this指向了Dog的实例，完成了Dog对Animal的继承关系
    this.breed = breed;
  }

  Dog.prototype = Object.create(Animal.prototype); // 等同于const obj = {};obj.__proto__ = Animal.prototype;Dog.prototype = obj;
  Dog.prototype.constructor = Dog;
  Dog.prototype.bark = function () {
    console.log(`${this.name} is barking`);
  };

  const myDog = new Dog("Buddy", "Golden Retriever");
  // 问题：以下代码的输出结果是什么？并解释原型链查找过程
  // hasOwnProperty() 方法返回一个布尔值，表示对象自有属性（而不是继承来的属性）中是否具有指定的属性
  console.log(myDog.hasOwnProperty("name")); // true 
  console.log(myDog.hasOwnProperty("bark")); // false
  console.log(myDog.hasOwnProperty("eat")); // false

  myDog.eat(); // Buddy is eating
  myDog.bark(); // Buddy is barking

  // 额外挑战：
  console.log(myDog.__proto__ === Dog.prototype); // true
  console.log(myDog.__proto__.__proto__ === Animal.prototype); // true
  console.log(myDog.__proto__.__proto__.__proto__ === Object.prototype); // true





</script>
